package ga.operadores.selecao;

import ga.base.Individuo;
import ga.base.OperadorSelecao;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

import problema.Solucao;

public class TorneioSubgrupos implements OperadorSelecao{

	@Override
	public List<Solucao> executar(List<Solucao> populacao, int tamanhoMaximo) {

		//G1 = 10%, G2 = 30%, G3 = 20%, G4 = 40%
		int index1 = 10*populacao.size()/100;
		int index2 = index1 *3;
		int index3 = index1 *2 + index2;

		//Cria sublistas
		List<Solucao> grupo1 = populacao.subList(0, index1);
		List<Solucao> grupo2 = populacao.subList(index1, index2);
		List<Solucao> grupo3 = populacao.subList(index2, index3);
		List<Solucao> grupo4 = populacao.subList(index3, populacao.size());

		//Ordena sublistas
		Collections.sort(grupo1);
		Collections.sort(grupo2);
		Collections.sort(grupo3);
		Collections.sort(grupo4);

		List<Solucao> novaPopulacao = new ArrayList<Solucao>();

		//Preenche a populacao final com os melhores das sublistas
		int pos =0;
		while(true){
			if(novaPopulacao.size() < tamanhoMaximo){
				if(grupo1.size() > pos){
					novaPopulacao.add(grupo1.get(pos));
				}
			}else
				break;
			
			if(novaPopulacao.size() < tamanhoMaximo){
				if(grupo2.size() > pos){
					novaPopulacao.add(grupo2.get(pos));
				}
			}else
				break;
			
			if(novaPopulacao.size() < tamanhoMaximo){
				if(grupo3.size() > pos){
					novaPopulacao.add(grupo3.get(pos));
				}
			}else
				break;
			
			if(novaPopulacao.size() < tamanhoMaximo){
				if(grupo4.size() > pos){
					novaPopulacao.add(grupo4.get(pos));
				}
			}else
				break;
			
			pos++;
		}

		return novaPopulacao;
	}

	@Override
	public Individuo executar(List<Solucao> populacao) {
		// TODO Auto-generated method stub
		return null;
	}

}
